/**
 * Partie.java - Gère la partie de Scrabble
 * 
 * @author BOURGE Denis && BEGORRE Alexandre
 * @version 1.0
 */

package jeu;

import java.awt.Dimension;
import java.io.IOException;

import javax.swing.JOptionPane;

import utils.InfoException;
import utils.StringUtils;

import elements.jetons.Sac;
import elements.plateau.Plateau;
import gui.Fenetre;

public class Partie {

	private Joueur				joueur1;
	private Joueur				joueur2;
	private Sac					sac;
	private Joueur				joueurCourant;
	private Plateau				plateau;
	private int					numTour;

	private static final int	LARGEUR_PLATEAU	= 480;
	private static final int	HAUTEUR_PLATEAU	= 480;

	/**
	 * Constructeur d'une partie
	 * 
	 * @param pathToDico
	 *            Chemin vers le dictionnaire
	 * @param nom1
	 *            Nom du joueur 1
	 * @param nom2
	 *            Nom du joueur 2
	 */
	public Partie(String pathToDico, String nom1, String nom2) {

		joueur1 = new Joueur(nom1);
		joueur2 = new Joueur(nom2);

		try {
			sac = new Sac(pathToDico);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		joueurCourant = joueur1;

		plateau = new Plateau();
		plateau.setPreferredSize(new Dimension(LARGEUR_PLATEAU, HAUTEUR_PLATEAU));
		plateau.setMinimumSize(plateau.getPreferredSize());
		plateau.setMaximumSize(plateau.getPreferredSize());

		numTour = 1;
	}

	/**
	 * Saisie d'un mot.
	 * 
	 * @param x
	 *            Position X
	 * @param y
	 *            Position Y
	 * @param horiz
	 *            Horizontal ou non
	 * @param mot
	 *            Le mot à placer
	 */
	public void saisieMot(Fenetre fen, int x, int y, boolean horiz, String mot) {

		try {
			String monTexte = StringUtils.normalizeWord(mot);

			if (numTour == 1 && x != (int) Plateau.TAILLE_PLATEAU / 2 && y != (int) Plateau.TAILLE_PLATEAU / 2) {
				JOptionPane.showMessageDialog(fen, "Vous devez placer le premier mot au centre !", "Erreur", JOptionPane.ERROR_MESSAGE);
			} else {
				if (sac.prendreDico().chercherMot(monTexte)) {
					getJoueurCourant().ajouterScore(plateau.ajouterMot(x, y, horiz, monTexte, joueurCourant.prendreRack(), numTour, sac.prendreDico()));

					if (getAutreJoueur().aAbandonne()) getAutreJoueur().abandon(false);

					JOptionPane.showMessageDialog(fen, getAutreJoueur().getNom() + ", à vous !", "OK !", JOptionPane.INFORMATION_MESSAGE);
					permuterJoueur();
					numTour++;
				} else {
					JOptionPane.showMessageDialog(fen, "Le mot \"" + monTexte + "\" n'est pas dans le dictionnaire !", "Erreur", JOptionPane.ERROR_MESSAGE);
				}
			}

			fen.mettreAJour();
			fen.repaint();

		} catch (InfoException e) {
			JOptionPane.showMessageDialog(fen, "Erreur: " + e.getMessage(), "Erreur", JOptionPane.ERROR_MESSAGE);
		}
	}

	/**
	 * Retourne le joueur courant
	 * 
	 * @return Le joueur courant
	 */
	public Joueur getJoueurCourant() {

		return joueurCourant;
	}

	/**
	 * Retourne l'autre joueur
	 * 
	 * @return L'autre joueur
	 */
	public Joueur getAutreJoueur() {

		if (joueurCourant.getNumero() == joueur1.getNumero()) return joueur2;
		else
			return joueur1;
	}

	/**
	 * Change le joueur courant
	 */
	public void permuterJoueur() {

		if (joueurCourant.getNumero() == joueur1.getNumero()) joueurCourant = joueur2;
		else
			joueurCourant = joueur1;
	}

	/**
	 * Message de fin de partie
	 * 
	 * @param fen
	 *            Fenêtre du jeu
	 */
	public void partieTerminee(Fenetre fen) {

		JOptionPane.showMessageDialog(fen, "*** Partie terminée ***\n\n" + "Scores: \n" + "Joueur " + joueur1.getNumero() + " - " + joueur1.getNom() + " : " + joueur1.getScore() + "\n" + "Joueur " + joueur2.getNumero() + " - " + joueur2.getNom() + " : " + joueur2.getScore(), "Partie terminée !", JOptionPane.INFORMATION_MESSAGE);
		System.exit(1);
	}

	/**
	 * Retourne le plateau
	 * 
	 * @return Le plateau
	 */
	public Plateau getPlateau() {

		return plateau;
	}

	/**
	 * Retourne le sac
	 * 
	 * @return Le sac
	 */
	public Sac getSac() {

		return sac;
	}

}
